package com.yociyy.admin.biz;

import com.yociyy.admin.mapper.BaseDeptMapper;
import com.yociyy.admin.model.entity.BaseDept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 部门信息 biz
 *
 * @author Y.yang
 * @date 2019-12-02
 */
@Service
public class BaseDeptBiz {

	@Autowired
	private BaseDeptMapper deptMapper;

	/**
	 * 部门信息列表
	 * 
	 * @param params 查询条件
	 * @return 部门信息列表
	 */
	public List<BaseDept> selectDeptList(Map<String, Object> params) {
		// 条件查询
		return deptMapper.selectDeptList(params);
	}

	/**
	 * 新增部门信息
	 *
	 * @param dept 部门信息
	 * @return 结果
	 */
	public int insertDept(BaseDept dept) {
		if (dept.getParentId() > 0) {
			// 查询父级部门的祖籍列表
			BaseDept parentDept = deptMapper.selectByPrimaryKey(dept.getParentId());
			// 拼接祖籍列表
			dept.setAncestors(this.getNewAncestors(parentDept));
		}
		return deptMapper.insertSelective(dept);
	}

	/**
	 * 修改部门信息
	 *
	 * @param dept 部门信息
	 * @return 结果
	 */
	public int updateDept(BaseDept dept) {
		// 查询新的父级部门信息
		BaseDept newParentDept = deptMapper.selectByPrimaryKey(dept.getParentId());
		// 查询修改前的部门信息
		BaseDept oldDept = deptMapper.selectByPrimaryKey(dept.getId());
		// 更新祖籍列表
		if (newParentDept != null && oldDept != null) {
			String newAncestors = this.getNewAncestors(newParentDept);
			String oldAncestors = oldDept.getAncestors();
			dept.setAncestors(newAncestors);
			this.updateDeptChildren(dept.getId(), newAncestors, oldAncestors);
		}
		return deptMapper.updateByPrimaryKeySelective(dept);
	}

	/**
	 * 拼接新的祖籍列表
	 * 
	 * @param dept 部门信息
	 * @return 祖籍列表串
	 */
	public String getNewAncestors(BaseDept dept) {
		String ancestors = "";
		// 如果是顶层，则直接拼接主键ID
		if (dept.getParentId() == 0) {
			ancestors = dept.getId() + "";
		} else {
			ancestors = dept.getAncestors() + "," + dept.getId();
		}
		return ancestors;
	}

	/**
	 * 更新部门孩子节点祖籍列表
	 *
	 * @param deptId 被修改的部门ID
	 * @param newAncestors 新的父ID集合
	 * @param oldAncestors 旧的父ID集合
	 */
	public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
		List<BaseDept> children = deptMapper.selectChildDeptById(deptId);
		if (children.size() > 0) {
			for (BaseDept child : children) {
				child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
				deptMapper.updateByPrimaryKeySelective(child);
			}
		}
	}

	/**
	 * 通过部门id检查是否存在子节点
	 *
	 * @param deptId 部门ID
	 * @return 结果
	 */
	public boolean checkHasChildByDeptId(Long deptId) {
		return deptMapper.checkHasChildByDeptId(deptId) > 0 ? true : false;
	}

	/**
	 * 通过部门id检查部门下是否存在用户
	 *
	 * @param deptId 部门ID
	 * @return 结果
	 */
	public boolean checkDeptExistUser(Long deptId) {
		return deptMapper.checkDeptExistUser(deptId) > 0 ? true : false;
	}

	/**
	 * 获取角色部门（数据权限）树
	 *
	 * @param roleId 角色id
	 * @return 部门id列表
	 */
	public Set<String> roleDeptIds(Long roleId) {
		return deptMapper.selectRoleDeptIds(roleId);
	}

	/**
	 * 删除部门信息通过主键id
	 *
	 * @param id 部门id
	 * @return 结果
	 */
	public int deleteById(Long id) {
		return deptMapper.deleteByPrimaryKey(id);
	}
}